Start new track segments on timer start events
authorMartin Buck <mb-tmp-tvguho.pbz@gromit.dyndns.org>
Tue, 13 Nov 2018 22:58:43 +0000 (23:58 +0100)
committerMartin Buck <mb-tmp-tvguho.pbz@gromit.dyndns.org>
Tue, 22 Jan 2019 22:10:46 +0000 (23:10 +0100)
Insert track segment separators when encountering a timer start event in a
FIT file (usually caused by manually pushing the start button). This way,
pauses in a FIT file don't appear as continuous tracks.

Also adapt reference tracks by adding suitable <trkseg> tags to please "make
check"/testo.

garmin_fit.cc
reference/track/garmin-edge-800-output.gpx
reference/track/garmin-forerunner-10-output.gpx
reference/track/wahoo-element-bolt.gpx

index b95a18019823b78847f9d3bb49b667d47662e60f..ad949f477d36c361aae61724eabcfc7ffa6ca1e3 100644 (file)
@@ -30,6 +30,7 @@
 const int kIdDeviceSettings = 0;
 const int kIdLap = 19;
 const int kIdRecord = 20;
+const int kIdEvent = 21;
 
 // constants for message fields
 // for all global IDs
@@ -56,12 +57,18 @@ const int kFieldPower = 7;
 const int kFieldTemperature = 13;
 const int kFieldEnhancedSpeed = 73;
 const int kFieldEnhancedAltitude = 78;
+// for global ID: event
+const int kFieldEvent = 0;
+const int kEnumEventTimer = 0;
+const int kFieldEventType = 1;
+const int kEnumEventTypeStart = 0;
 
 // For developer fields as a non conflicting id
 const int kFieldInvalid = 255;
 
 static char* opt_allpoints = nullptr;
 static int lap_ct = 0;
+static bool new_trkseg = false;
 
 static
 arglist_t fit_args[] = {
@@ -346,6 +353,7 @@ fit_read_field(fit_field_t* f)
                 MYNAME, f->type, f->size, fit_data.len);
   }
   switch (f->type) {
+  case 0: // enum
   case 1: // sint8
   case 2: // uint8
     if (f->size == 1) {
@@ -414,6 +422,8 @@ fit_parse_data(fit_message_def* def, int time_offset)
   int32_t endlat = 0x7fffffff;
   int32_t endlon = 0x7fffffff;
   uint32_t starttime = 0; // ??? default ?
+  uint8_t event = 0xff;
+  uint8_t eventtype = 0xff;
   char cbuf[10];
   Waypoint* lappt;  // WptPt in gpx
 
@@ -593,6 +603,23 @@ fit_parse_data(fit_message_def* def, int time_offset)
         // end of case def->global_id = kIdLap
         break;
 
+      case kIdEvent:
+        switch (f->id) {
+        case kFieldEvent:
+          if (global_opts.debug_level >= 7) {
+            debug_print(7,"%s: parsing fit data: event=%d\n", MYNAME, val);
+          }
+          event = val;
+          break;
+        case kFieldEventType:
+          if (global_opts.debug_level >= 7) {
+            debug_print(7,"%s: parsing fit data: eventtype=%d\n", MYNAME, val);
+          }
+          eventtype = val;
+          break;
+        } // switch (f->id)
+        // end of case def->global_id = kIdEvent
+        break;
       default:
         if (global_opts.debug_level >= 1) {
           debug_print(1, "%s: unrecognized/unhandled global ID for GARMIN FIT: %d\n", MYNAME, def->global_id);
@@ -652,8 +679,21 @@ fit_parse_data(fit_message_def* def, int time_offset)
     if (temperature != 0x7f) {
       WAYPT_SET(waypt, temperature, temperature);
     }
+    if (new_trkseg) {
+      waypt->wpt_flags.new_trkseg = 1;
+      new_trkseg = false;
+    }
     track_add_wpt(fit_data.track, waypt);
     break;
+  case kIdEvent: // event message
+    if (event == kEnumEventTimer && eventtype == kEnumEventTypeStart) {
+      // Start event, start new track segment. Note: We don't do this
+      // on stop events because some GPS devices seem to generate a last
+      // trackpoint after the stop event and that would erroneously get
+      // assigned to the next segment.
+      new_trkseg = true;
+    }
+    break;
   }
 }
 
index 7b66c8c968d5c95ea9dc059abeb16877da4f7840..994757c7db7307dd100f35950e93b8e81059068d 100644 (file)
         <time>2012-04-12T12:56:05Z</time>
         <speed>0.000000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="48.187666381" lon="11.854188457">
         <ele>517.200</ele>
         <time>2012-04-12T12:56:31Z</time>
         <time>2012-04-12T13:15:45Z</time>
         <speed>0.000000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="48.186057223" lon="11.822205210">
         <ele>542.000</ele>
         <time>2012-04-12T13:15:48Z</time>
         <time>2012-04-12T13:16:51Z</time>
         <speed>0.000000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="48.186576817" lon="11.821112377">
         <ele>544.000</ele>
         <time>2012-04-12T13:17:16Z</time>
         <time>2012-04-12T13:26:29Z</time>
         <speed>0.000000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="48.174140671" lon="11.811101954">
         <ele>526.400</ele>
         <time>2012-04-12T13:26:45Z</time>
         <time>2012-04-12T13:26:57Z</time>
         <speed>0.000000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="48.173926598" lon="11.811192227">
         <ele>526.400</ele>
         <time>2012-04-12T13:27:38Z</time>
         <time>2012-04-12T13:29:06Z</time>
         <speed>0.000000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="48.171076583" lon="11.816465199">
         <ele>528.400</ele>
         <time>2012-04-12T13:29:17Z</time>
         <time>2012-04-12T13:29:21Z</time>
         <speed>0.000000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="48.171064345" lon="11.816544240">
         <ele>528.400</ele>
         <time>2012-04-12T13:29:26Z</time>
index 8eeab2bb30e69790a14e3b6691b059b68d49c910..274934dd6309cfe4e7d4e6570725ad116f1fbaaa 100644 (file)
@@ -67,6 +67,8 @@
         <time>2013-06-13T03:56:36Z</time>
         <speed>0.376000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="52.403139059" lon="13.419341572">
         <time>2013-06-13T03:56:40Z</time>
         <speed>1.953000</speed>
         <time>2013-06-13T04:03:00Z</time>
         <speed>0.091000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="52.414478684" lon="13.401474540">
         <time>2013-06-13T04:03:20Z</time>
         <speed>3.568000</speed>
         <time>2013-06-13T04:03:34Z</time>
         <speed>0.123000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="52.414743552" lon="13.401259963">
         <time>2013-06-13T04:04:05Z</time>
         <speed>2.382000</speed>
         <time>2013-06-13T04:05:38Z</time>
         <speed>0.164000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="52.412753772" lon="13.392770772">
         <time>2013-06-13T04:06:06Z</time>
         <speed>3.186000</speed>
         <time>2013-06-13T04:07:52Z</time>
         <speed>0.177000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="52.411193397" lon="13.382592794">
         <time>2013-06-13T04:09:23Z</time>
         <speed>2.474000</speed>
         <time>2013-06-13T04:13:00Z</time>
         <speed>0.079000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="52.412378598" lon="13.362509922">
         <time>2013-06-13T04:13:22Z</time>
         <speed>3.287000</speed>
index a79856011eeee3deb036b841a327426c7bb1921d..ca1b1de8f1d5210f227c4fcd33832451172da680 100644 (file)
         <time>2018-03-20T07:13:58Z</time>
         <speed>1.151000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="51.705748370" lon="8.721013353">
         <ele>116.400</ele>
         <time>2018-03-20T07:14:11Z</time>
         <time>2018-03-20T07:14:16Z</time>
         <speed>0.000000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="51.705778126" lon="8.721019555">
         <ele>117.000</ele>
         <time>2018-03-20T07:14:19Z</time>
         <time>2018-03-20T07:27:13Z</time>
         <speed>0.000000</speed>
       </trkpt>
+    </trkseg>
+    <trkseg>
       <trkpt lat="51.704860056" lon="8.755921632">
         <ele>168.200</ele>
         <time>2018-03-20T07:27:26Z</time>